﻿using System.Collections.Generic;
using System.Linq;
using Neptuno.Model;
using Neptuno.Model.Utilities;
using System;
using System.Data.Objects;

namespace Neptuno.Component
{
    public class AutenticacionComponent : BaseComponent
    {
        private Usuarios Usuario;
        private Response Response;

        public AutenticacionComponent(string username, string password)
        {
           Usuarios Usuario = this.Context.Usuarios.SingleOrDefault(t => t.userName == username && t.password == password);

            if (Usuario != null)
            {
                if (Usuario.isActive)
                {
                    Usuario.lastActivityDay = DateTime.Now;
                    this.Context.SaveChanges();

                    this.Usuario = Usuario;

                    this.Response = new Response { success = true };
                }
                else
                {
                    this.Response = new Response
                    {
                        message = "Usuario inactivo",
                        success = false
                    };
                }
            }
            else
            {
                this.Response = new Response
                {
                    message = "Usuario y/o contraseña invalidos",
                    success = false
                };
            }
        }

        public AutenticacionComponent() { }

        public Response Login()
        {
           if (this.Usuario != null)
            {
                if (this.Usuario.UsuariosEnRol != null)
                {
                    List<Roles> Lista = this.Context.UsuariosEnRol.Where(t => t.userName == this.Usuario.userName).Select(t => t.Roles).ToList();
                    this.Response.data = Lista;
                }
            }
            return this.Response;
        }

        public Usuarios GetUsuario()
        {
            return this.Usuario;
        }

        public void AgregarUsuario(Usuarios Usuario)
        {
            Usuario.isActive = true;

            List<Usuarios> Usuarios = new List<Model.Usuarios>();

            Context.Usuarios.AddObject(Usuario);

            if (Context.TryToSave())
                Usuarios.Add(Usuario);
        }

        public void AgregarUsuario(Usuarios Usuario, string AgenciaUsername)
        {
            Usuario.idAgencia = this.Context.Usuarios.SingleOrDefault(t => t.userName == AgenciaUsername).idAgencia;
            AgregarUsuario(Usuario);
        }

        public bool EliminarUsuario(string username, string administrador)
        {
            if (this.Context.Usuarios.Single(t => t.userName == administrador).UsuariosEnRol.ToList().Exists(t => t.idRol == 1))
            {
                this.Context.DeleteObject(Context.Usuarios.Single(t => t.userName == username));
                return Context.TryToSave();
            }

            return false;
        }

        public void ActualizarContrasena(string password)
        {
            List<ObjectParameter> parametros = new List<ObjectParameter>();

            parametros.Add(new ObjectParameter("username", this.Usuario.userName));
            parametros.Add(new ObjectParameter("password", password));
            
            Usuario.password = password;
            Context.TryToSave();
            
            Context.ExecuteFunction("ChangePassword", parametros.ToArray());
            
        }

        public bool AsignarRol(string username, int idRol)
        {
            this.Context.UsuariosEnRol.AddObject(new UsuariosEnRol
            {
                idRol = idRol,
                userName = username
            });
            
            return this.Context.TryToSave();
        }

        public List<string> GetUsuarios()
        {
            return this.Context.Usuarios.Where(t => t.idAgencia == Usuario.idAgencia && t.userName != Usuario.userName).Select(t => t.userName).ToList();
        }

        public List<Roles> GetRoles(string username)
        {
            return this.Context.UsuariosEnRol.Where(t => t.userName == username).Select(t => t.Roles).ToList();
        }
    }
}